# Логирование

Главное правило логирования: вся работа приложения должна быть понятна по внутренним логам приложения.

Очень часто приложение является одним из сервисов более сложной системы, которая обменивается данными внутри себя по многим каналам и протоколам: HTTP, Kafka и прочее.
При этом, бывают ситуации, когда такой сервис логирует сам факт получения данных, но не сами данные; а чтобы увидеть данные, нужно идти, например, в Kafka, и смотреть там.

Мы ожидаем, что, чтобы понять, что делало приложение, достаточно будет зайти во внутренние логи приложения (консоль, Kibana - неважно) - и эти логи будут полными, насколько это возможно.
Нам не придётся идти в логи Kafka и других сервисов, чтобы воссоздать всю картину работы _нашего_ приложения.
Если наше приложение получает данные и их нужно залогировать, их логирует _наше_ приложение, а не какое-то другое.

## Общие правила логирования

Мы логируем данные, а не детали реализации получателя данных.
Например, мы логируем топик сообщения, полученного через Kafka, но не логируем, что сообщение было получено через Kafka.

Уровень успешного лога: **_INFO_**.
Уровень неуспешного лога: **_ERROR_**

### Логирование REST-запросов в сервис

Для REST-запросов мы логируем следующие атрибуты: HTTP-метод, URI (включая переменные), хэдеры, параметры запроса, тело запроса (в формате JSON).

Пример входящего REST-запроса:

```
Incoming request log ::
        >>> []        (incoming request)
        Method:       GET
        URI:          '/v2/absence/request/4c3b6a59-7453-4ee2-b7dc-d428f53a1cef'
        Params:       [ user-id=[a7126eb5-27cf-408d-a866-3a5df0176747] ]
```

Для ответов на такие запросы, мы логируем: HTTP-статус, тело ответа (в формате JSON).

Пример ответа:

```
Outgoing response log ::
        <<< []       (outgoing response)
        HTTP-Status: 200
        Body:        {"data":{"id":"4c3b6a59-7453-4ee2-b7dc-d428f53a1cef"},"success":true}
```

### Логирование REST-запросов из сервиса

Логирование таких REST-запросов полностью повторяет таковое для REST-запросов в сервис, с уточнением, что они _из_ сервиса.

Примеры запроса:

```
Outgoing request log ::
        [] -->        (outgoing request)
        Method:       GET
        URI:          '/v2/absence/request/4c3b6a59-7453-4ee2-b7dc-d428f53a1cef'
        Params:       [ user-id=[a7126eb5-27cf-408d-a866-3a5df0176747] ]
```

Пример полученного ответа:

```
Incoming response log ::
        [] <--       (incoming response)
        HTTP-Status: 200
        Body:        {"data":{"id":"4c3b6a59-7453-4ee2-b7dc-d428f53a1cef"},"success":true}
```

### Логирование запросов брокера

Для сообщений брокера мы логируем: топик, сообщение (в формате JSON).

Пример лога:

```
Incoming message from broker ::
        [] <<--       (incoming message)
        Topic:        app-topic
        Message:      {"data":{"id":"4c3b6a59-7453-4ee2-b7dc-d428f53a1cef"},"success":true}
```

Пример сообщения, отправленного в брокер:

```
Outgoing message to broker ::
        [] -->>       (outgoing message)
        Topic:        app-topic
        Message:      {"data":{"id":"4c3b6a59-7453-4ee2-b7dc-d428f53a1cef"},"success":true}
```
